/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package stud.cp.user.plugins.designer;

import java.math.BigInteger;
import javax.ejb.Stateless;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import stud.cp.core.dbaccess.DAOException;
import stud.cp.core.plugins.PluginConst;
import stud.cp.core.plugins.PluginRouter;
import stud.cp.core.plugins.WrongPageRequest;
import stud.cp.user.dbaccess.OracleDAOFactory;
import stud.cp.user.valueobjects.PropertyListValue;
import stud.cp.user.valueobjects.PropertyTypeDef;

/**
 * Класс, работающий с набором готовых
 * значений.
 * @author Morfant
 */
@Stateless
public class ListValuePluginBean implements ListValuePlugiLocal {

    /**
     * Фабрика DAO классов.
     */
    private OracleDAOFactory oracleDAOFactory = null;
    /**
     * Логгер.
     */
    private static Logger logger = Logger.getLogger("CPTNP");

    /**
     * Метод, реализующий основную бизнеслогику.
     * @param req Реквест.
     * @return Класс роутер.
     */
    @Override
    public PluginRouter perform(HttpServletRequest req) {
        String subaction = req.getParameter(PluginConst.SUBACTION);
        if ((subaction != null) && (!subaction.equals(""))) {
            try {
                oracleDAOFactory = new OracleDAOFactory();
                oracleDAOFactory.initialize();

                /* Список действий которые могут выполниться. */
                /*Список данных*/
                if (subaction.equals(PluginConst.GET_LIST)) {
                    return getListPage(req);
                }

                /*Страница добавления*/
                if (subaction.equals(PluginConst.GET_ADD_PAGE)) {
                    return getAddPage(req);
                }

                /*Добавление новых данных*/
                if (subaction.equals(PluginConst.NEW_DATA)) {
                    return newData(req);
                }

                /*Страница редактирования*/
                if (subaction.equals(PluginConst.GET_EDIT_PAGE)) {
                    return getEditPage(req);
                }

                /*Сохранение измененных данных*/
                if (subaction.equals(PluginConst.SAVE_DATA)) {
                    return saveData(req);
                }

                /*Страница удаления*/
                if (subaction.equals(PluginConst.GET_DELETE_PAGE)) {
                    return getDeletePage(req);
                }

                /*Удаление данные*/
                if (subaction.equals(PluginConst.DELETE_DATA)) {
                    return deleteData(req);
                }
                req.setAttribute(PluginConst.ERROR_MESSAGE,
                        "Действия для данного типа поддействия не найдено. Тип поддействия = " + subaction);
            } catch (DAOException ex) {
                logger.debug("Error due access to database. "
                        + "Plugin = WeaponTypePluginBean. "
                        + "Subaction=" + subaction, ex);
                req.setAttribute(PluginConst.ERROR_MESSAGE,
                        "Ошибка доступа к данным. " + ex.getMessage());
            } catch (WrongPageRequest ex) {
                req.setAttribute(PluginConst.ERROR_MESSAGE,
                        "Данные из реквеста ошибочны :\n" + ex.getMessage());
            } finally {
                if (oracleDAOFactory != null) {
                    try {
                        oracleDAOFactory.cleanUp();
                    } catch (DAOException ex) {
                        logger.debug("Error due access to database. "
                                + "Plugin = WeaponTypePluginBean. "
                                + "Subaction=" + subaction, ex);
                        req.setAttribute(PluginConst.ERROR_MESSAGE,
                                "Ошибка доступа к данным. " + ex.getMessage());
                    }
                }
            }
        } else {
            req.setAttribute(PluginConst.ERROR_MESSAGE,
                    "Тип поддействия не задан.");
        }
        return new PluginRouter("/errorpage.jsp");
    }

    /**
     * Метод, который позволяет получить
     * список данных запрашиваемого типа.
     * @param req Реквест.
     * @return PluginRouter на страницу в который будет выводиться список.
     * @throws DAOException Ошибки доступа к базе данных.
     */
    private PluginRouter getListPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String list_value_def_id = req.getParameter(PluginConst.LIST_VALUE_DEF_ID);
        if (list_value_def_id != null) {
            PropertyTypeDef propertyTypeDef = null;
            propertyTypeDef = oracleDAOFactory.getPropertyTypeDefsDAO().getById(new BigInteger(list_value_def_id));
            if (propertyTypeDef != null) {
                req.setAttribute(PluginConst.LIST_VALUE_LIST,
                        oracleDAOFactory.getPropertyListValuesDAO().getAllForListValueDef(propertyTypeDef.getProperty_type_def_id()));
                req.setAttribute(PluginConst.LIST_VALUE_DEF_ID, list_value_def_id);
                return new PluginRouter("/Designer/ListValueDefinition/ListValue/ListValuesTable.jsp");
            } else {
                throw new WrongPageRequest("Набора с таким id=" + list_value_def_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID группы атрибутов не заданно.");
        }
    }

    /**
     * Метод, который позволяет получить
     * страницу добавления.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     */
    private PluginRouter getAddPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String list_value_def_id = req.getParameter(PluginConst.LIST_VALUE_DEF_ID);
        if (list_value_def_id != null) {
            PropertyTypeDef propertyTypeDef = null;
            propertyTypeDef = oracleDAOFactory.getPropertyTypeDefsDAO().getById(new BigInteger(list_value_def_id));
            if (propertyTypeDef != null) {
                req.setAttribute(PluginConst.LIST_VALUE_DEF_ID, propertyTypeDef.getProperty_type_def_id());
                return new PluginRouter("/Designer/ListValueDefinition/ListValue/AddListValue.jsp");
            } else {
                throw new WrongPageRequest("Набора с таким id=" + list_value_def_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID группы атрибутов не заданно.");
        }
    }

    /**
     * Метод, позволяющий добавлять новые данные.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter newData(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String listValueValue = req.getParameter(PluginConst.LIST_VALUE_VALUE);
        String list_value_def_id = req.getParameter(PluginConst.LIST_VALUE_DEF_ID);
        String error_message = "";
        if (list_value_def_id == null) {
            error_message = error_message + "ID набора должно быть заданно.";
        }
        if ((listValueValue == null) || (listValueValue.equals(""))) {
            error_message = error_message + "Значение не может быть пустым!";
        }
        if (error_message.equals("")) {
            PropertyTypeDef propertyTypeDef = null;
            propertyTypeDef = oracleDAOFactory.getPropertyTypeDefsDAO().getById(new BigInteger(list_value_def_id));
            if (propertyTypeDef != null) {
                oracleDAOFactory.getPropertyListValuesDAO().
                        create(new PropertyListValue(propertyTypeDef.getProperty_type_def_id(), listValueValue));
                return new PluginRouter("list-value-action.do"
                        + "?"
                        + PluginConst.SUBACTION
                        + "="
                        + PluginConst.GET_LIST
                        + "&"
                        + PluginConst.LIST_VALUE_DEF_ID
                        + "="
                        + list_value_def_id, false);
            } else {
                throw new WrongPageRequest("Набора с таким id=" + list_value_def_id + " не существует. ");
            }
        } else {
            req.setAttribute(PluginConst.ERROR_MESSAGE, error_message);
            return getAddPage(req);
        }
    }

    /**
     * Метод, который позволяет
     * перейти на страницу редактирования данных.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter getEditPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String list_value_id = req.getParameter(PluginConst.LIST_VALUE_ID);
        if (list_value_id != null) {
            PropertyListValue propertyListValue = null;
            propertyListValue = oracleDAOFactory.getPropertyListValuesDAO().getById(new BigInteger(list_value_id));
            if (propertyListValue != null) {
                req.setAttribute(PluginConst.LIST_VALUE, propertyListValue);
                return new PluginRouter("/Designer/ListValueDefinition/ListValue/EditListValue.jsp");
            } else {
                throw new WrongPageRequest("Значения с таким id=" + list_value_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID группы атрибутов не заданно.");
        }
    }

    /**
     * Сохранение данных.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter saveData(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String list_value_value = req.getParameter(PluginConst.LIST_VALUE_VALUE);
        String list_value_id = req.getParameter(PluginConst.LIST_VALUE_ID);
        String error_message = "";
        if (list_value_id == null) {
            throw new WrongPageRequest("ID группы атрибутов не заданно.");
        }
        if ((list_value_value == null) || (list_value_value.equals(""))) {
            error_message = error_message + "Имя группы атрибутов не должно быть пустым!";
        }
        if (error_message.equals("")) {
            PropertyListValue old = oracleDAOFactory.getPropertyListValuesDAO().getById(new BigInteger(list_value_id));
            if (old != null) {
                old.setValue(list_value_value);
                oracleDAOFactory.getPropertyListValuesDAO().update(old);
                return new PluginRouter("list-value-action.do"
                        + "?"
                        + PluginConst.SUBACTION
                        + "="
                        + PluginConst.GET_LIST
                        + "&"
                        + PluginConst.LIST_VALUE_DEF_ID
                        + "="
                        + old.getProperty_type_def_id(), false);
            } else {
                throw new WrongPageRequest("Значения с таким id=" + list_value_id + " не существует. ");
            }
        } else {
            req.setAttribute(PluginConst.ERROR_MESSAGE, error_message);
            return getEditPage(req);
        }
    }

    /**
     * Метод, который позволяет
     * перейти на страницу удаления элемента.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter getDeletePage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String list_value_id = req.getParameter(PluginConst.LIST_VALUE_ID);
        if (list_value_id != null) {
            PropertyListValue propertyListValue = oracleDAOFactory.getPropertyListValuesDAO().
                    getById(new BigInteger(list_value_id));
            if (propertyListValue != null) {
                req.setAttribute(PluginConst.LIST_VALUE, propertyListValue);
                return new PluginRouter("/Designer/ListValueDefinition/ListValue/DeleteListValue.jsp");
            } else {
                throw new WrongPageRequest("Значения с таким id=" + list_value_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID группы атрибутов не заданно.");
        }
    }

    /**
     * Метод, удаляющий данные из базы данных.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter deleteData(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String list_value_id = req.getParameter(PluginConst.LIST_VALUE_ID);
        if (list_value_id != null) {
            PropertyListValue old = oracleDAOFactory.getPropertyListValuesDAO().getById(new BigInteger(list_value_id));
            if (old != null) {
                if (oracleDAOFactory.getPropertyListValuesDAO().
                        getAllForListValueDef(old.getProperty_type_def_id()).size() > 1) {
                    oracleDAOFactory.getPropertyListValuesDAO().delete(new BigInteger(list_value_id));
                    return new PluginRouter("list-value-action.do"
                            + "?"
                            + PluginConst.SUBACTION
                            + "="
                            + PluginConst.GET_LIST
                            + "&"
                            + PluginConst.LIST_VALUE_DEF_ID
                            + "="
                            + old.getProperty_type_def_id(), false);
                } else {
                    req.setAttribute(PluginConst.ERROR_MESSAGE, "В наборе не может быть меньше одного значения!");
                    return getDeletePage(req);
                }
            } else {
                throw new WrongPageRequest("Значения с таким id=" + list_value_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID группы атрибутов не заданно.");
        }
    }
}
